﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using Negocio.catalogos;
using Negocio;
using Negocio.clases_tontas;
namespace Presentacion.controlasistencia
{
    public partial class justificacionEnMasa : System.Web.UI.Page
    {
        //objetos
        /// <summary>
        /// objeto catalogo distribucion
        /// </summary>
        catalogoDistribucion _objD = new catalogoDistribucion();
        //variables 
        StringBuilder html = new StringBuilder();
        //int idCabecera = 0;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["admin"] == null)
            {
                Server.Transfer("404.aspx");
            }
        }

        protected void Agregar_Click(object sender, EventArgs e)
        {

        }
        //protected void btnAsiSemestre_Click(object sender, EventArgs e)
        //{
        //    int numSemestre = Convert.ToInt32(semestre.Value);
        //    asistenciaPorSemestre(numSemestre,Convert.ToInt32(Session["CodCarrera"]));   
        //}
        #region ingresar asistencias semestre
        /// <summary>
        /// Metodo para obtener las distribuciones por semestre
        /// </summary>
        /// <param name="_semestre">filtro</param>
        /// <param name="_desde">filtro</param>
        /// <param name="_hasta">filtro</param>
        /// <returns>las distribuciones</returns>
        [System.Web.Services.WebMethod(true)]
        public static string distribucionPorSemestre(int _semestre, string _desde, string _hasta, string _observacion, string _paralelo)
        {
            DateTime fechActual = DateTime.Now.Date;
            StringBuilder html = new StringBuilder();
            StringBuilder html2 = new StringBuilder();
            if (_desde != "" && _hasta != "" && _observacion != "")
            {
                DateTime fechaDesde = Convert.ToDateTime(_desde);
                DateTime fechaHasta = Convert.ToDateTime(_hasta);
                if (fechaDesde < fechActual || fechaDesde > fechaHasta)
                {
                    html.Append("<tr><td>Ninguna</td><td >Se deben de llenar todos los datos</td></tr>");
                    return html.ToString();
                }
                else if (_semestre > 0 && _desde != "" && _hasta != "" && _observacion != "")
                {
                    catalogoDistribucion _objD = new catalogoDistribucion();
                    //variables
                    var distribuciones = _objD.obtenerDistribucionXSemestre(_semestre, Convert.ToInt32(HttpContext.Current.Session["CodCarrera"]), _paralelo);
                    int contador = 0;
                    try
                    {
                        foreach (var item in distribuciones)
                        {
                            html.Append("<tr><td>" + (contador += 1) + "</td><td>" + item.Nombre + "</td></tr>");
                        }
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                    return html.ToString();
                }
                else
                {
                    html.Append("<tr><td>Ninguna</td><td >Se deben de llenar todos los datos</td></tr>");
                    return html.ToString();
                }
            }
            else
            {
                html.Append("<tr><td>Ninguna</td><td >Se deben de llenar todos los datos</td></tr>");
                return html.ToString();
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="_semestre"></param>
        /// <param name="_desde"></param>
        /// <param name="_hasta"></param>
        /// <param name="_observacion"></param>
        /// <returns></returns>
        [System.Web.Services.WebMethod(true)]
        public static string ingresarAsistenciaSemestre(int _semestre, string _desde, string _hasta, string _observacion, string _paralelo)
        {
            try
            {
                string mensaje = comprobarAsistencia(_semestre, _desde, _hasta, _observacion, _paralelo);
                if (mensaje == "OK")
                {
                    return "Asistencias ingresadas correctamente.";
                }
                else if (mensaje == "Error")
                {
                    return "Problemas al ingresar las asistencias.";
                }
                else if (mensaje == "Evento")
                {
                    return "Para este dia esta previsto la realizacion de un evento.";
                }
                else
                {
                    return "Ingresar las fechas de manera correcta.";
                }
            }
            catch (Exception)
            {
                return "Problemas al ingresar las asistencias.";
            }
        }
        /// <summary>
        /// Comprueba la asistencia
        /// </summary>
        /// <param name="_semestre">filtro</param>
        /// <param name="_desde">filtro</param>
        /// <param name="_hasta">filtro</param>
        /// <param name="_observacion">parametro</param>
        /// <returns></returns>
        public static string comprobarAsistencia(int _semestre, string _desde, string _hasta, string _observacion, string _paralelo)
        {
            //catalogos
            catalogoHorario _objH = new catalogoHorario();
            catalogoDistribucion _objD = new catalogoDistribucion();
            catalogoEstudiante _objE = new catalogoEstudiante();
            catalogoCabecera _objC = new catalogoCabecera();
            catalogoCalendarioAcademico _objCa = new catalogoCalendarioAcademico();
            string hdfCabeceraActual;
            string mensaje = "";
            int diasMes = 0;
            //fechas
            DateTime fechActual = DateTime.Now.Date;

            if (_desde != "" && _hasta != "" && _observacion != "")
            {
                DateTime fechaDesde = Convert.ToDateTime(_desde).Date;
                DateTime fechaHasta = Convert.ToDateTime(_hasta).Date;
                if (fechaDesde < fechActual || fechaDesde > fechaHasta)
                {
                    return "Ingresar las fechas de manera correcta";
                }
                else if (HttpContext.Current.Session["CodCarrera"] != null && _desde != "" && _hasta != "" && _observacion != "")
                {
                    //// los dias q no tendra clase
                    int dias = fechaHasta.Subtract(fechaDesde).Days;
                    try
                    {
                        for (int i = 0; i < dias + 1; i++)
                        {
                            List<distribucion> distribuciones = null;
                            if (_semestre != 0)
                            {
                                distribuciones = _objD.obtenerDistribucionXSemestre(_semestre, Convert.ToInt32(HttpContext.Current.Session["CodCarrera"]), _paralelo);
                            }
                            else
                            {
                                distribuciones = _objD.obtenerDistribucionXIdCarrera(Convert.ToInt32(HttpContext.Current.Session["CodCarrera"]));
                            }
                            //aumenta el dia cuando son varios
                            diasMes = DateTime.DaysInMonth(fechaDesde.Year, fechaDesde.Month);
                            DateTime nuevaFecha=fechaDesde.AddDays(i);

                            foreach (var item in distribuciones)
                            {
                                //Horario Actual
                                var consultaHorario = _objH.obtenerHorarioXidPeriodoANDidDistribucion(Convert.ToInt32(HttpContext.Current.Session["periodo"]), Convert.ToInt32(item.idDistribucion));
                                var resultFiltroHorario = (from itemHorario in consultaHorario where itemHorario.detalle == nuevaFecha.DayOfWeek.ToString() select itemHorario);

                                if (resultFiltroHorario.Count() != 0)
                                {
                                    //Lista de cabecera
                                    var resultCabecera = _objC.obtenerCabeceraXIdDistribucionANDidPerido(item.idDistribucion, Convert.ToInt32(HttpContext.Current.Session["periodo"]));
                                    int contadorCabecera = (from itemCabecera in resultCabecera where itemCabecera.fechaCabecera.Date == nuevaFecha select itemCabecera).Count();
                                    //busqueda de la cabecera guardada
                                    if (contadorCabecera == 0)
                                    {
                                        //obtengo un numero del objeto horario
                                       
                                        //pregunto por las fechas de los eventos
                                        var resultCalendario = _objCa.obtenerCalendarioAcademicoxPeriodo(Convert.ToInt32(HttpContext.Current.Session["periodo"])).Where(R => R.start.Value.Date == nuevaFecha);
                                        if (resultCalendario.Count() != 0)
                                        {
                                            return "Evento";
                                        }
                                        if (resultCalendario.Count() == 0 && nuevaFecha.DayOfWeek != DayOfWeek.Saturday && nuevaFecha.DayOfWeek != DayOfWeek.Sunday)
                                        {
                                            //Ingreso de las cabeceraAsistencia con los id de los estudiantes
                                            
                                            
                                                var idCabecera = _objC.insertarCabecera(new cabecera(0, resultFiltroHorario.First(), nuevaFecha, false, 211049));
                                                if (idCabecera != 0)
                                                {
                                                    hdfCabeceraActual = idCabecera.ToString();
                                                    mensaje = confirmarAsistencia(item.idDistribucion, hdfCabeceraActual, nuevaFecha, _observacion);
                                                }
                                            
                                        }//end if
                                    }
                                }
                            }//end foreach

                        }
                    }
                    catch (Exception)
                    {
                        return "Error";
                    }
                    //end for
                    if (mensaje == "OK")
                    {
                        return "OK";
                    }
                    else
                    {
                        return "Error";
                    }
                }
                else
                {
                    return "Error";
                }
            }
            else
            {
                return "Error";
            }
        }
        /// <summary>
        /// Ingresa la asistencia
        /// </summary>
        /// <param name="_codDistribucion">filtro</param>
        /// <param name="_idCabecera">filtro</param>
        /// <param name="_nuevaFecha">filtro</param>
        /// <param name="_observacion">parametro</param>
        public static string confirmarAsistencia(int _codDistribucion, string _idCabecera, DateTime _nuevaFecha, string _observacion)
        {
            //catalogos
            /// <summary>
            /// objeto catalogo estudiante
            /// </summary>
            catalogoEstudiante _objE = new catalogoEstudiante();
            /// <summary>
            /// objeto catalogo cabecera Asistencia
            /// </summary>
            catalogoCabeceraAsistencia _objCA = new catalogoCabeceraAsistencia();
            /// <summary>
            /// objeto catalogo Asistencia
            /// </summary>
            catalogoAsistencia _objA = new catalogoAsistencia();
            catalogoHorario _objH = new catalogoHorario();
            //variables
            var idCabeceraAsistencia = 0;
            int nroHoraDistribucion = 0;
            var listaEstudiantes = _objE.obtenerEstudiante(_codDistribucion);
            var listadoCabecera = _objCA.obtenerCabeceraAsistenciaXIDCabecera(Convert.ToInt32(_idCabecera));
            if (listadoCabecera.Count != listaEstudiantes.Count)
            {
                try
                {
                    foreach (var item in listaEstudiantes)
                    {
                        var cabeceraAsistencia = _objCA.obtenerCabeceraAsistenciaXIDCabeceraANDIDEstudiante(Convert.ToInt32(_idCabecera), item.Id_Alumno);

                        if (cabeceraAsistencia == null)
                        {
                            idCabeceraAsistencia = _objCA.insertarCabecetaAsistencia(new cabeceraAsistencia
                        {
                            idEstudiante = item.Id_Alumno,
                            idCabecera = Convert.ToInt32(_idCabecera),
                            idObservacion = 211045
                        });
                                
                            
                            if (idCabeceraAsistencia != 0)
                            {
                                nroHoraDistribucion = _objH.obtenerNroHoraHorarioXDIa(Convert.ToInt32(HttpContext.Current.Session["periodo"]), _codDistribucion, _nuevaFecha);
                                for (int i = 0; i < nroHoraDistribucion; i++)
                                {
                                    ///el "1" es por el tipo de asistencia 1="A" en la tabla de tipo asistencia
                                    _objA.ingresarAsistencia2(_nuevaFecha, 1, idCabeceraAsistencia, _observacion);
                                }
                            }
                        }
                    }
                    return "OK";
                }
                catch (Exception)
                {
                    return "Error";
                }
            }
            else
            {
                return "Error";
            }
        }
        #endregion

        #region ingresar asistencias por carrera
        /// <summary>
        /// Obtiene todas las distribuciones de la carrera
        /// </summary>
        /// <param name="_desde">filtro</param>
        /// <param name="_hasta">filtro</param>
        /// <returns>las distribuciones</returns>
       
        [System.Web.Services.WebMethod(true)]
        public static string distribucionPorCarrera(string _desde, string _hasta, string _observacion, string _paralelo)
        {
            StringBuilder html = new StringBuilder();
            StringBuilder html2 = new StringBuilder();
            string[] semestre = { "Primer", "Segundo", "Tercer", "Cuarto", "Quinto", "Sexto", "Séptimo", "Octavo", "Noveno", "Décimo" };
            DateTime fechActual = DateTime.Now.Date;
            DateTime fechaDesde = Convert.ToDateTime(_desde);
            DateTime fechaHasta = Convert.ToDateTime(_hasta);
            if (fechaDesde < fechActual || fechaDesde > fechaHasta)
            {
                html.Append("<tr><td>Ninguna</td><td >Se deben de llenar todos los datos</td></tr>");
                html2.Append("");
                return html.ToString();
            }
            else if (HttpContext.Current.Session["CodCarrera"] != null && _desde != "" && _hasta != "" && _observacion != "")
            {
                catalogoDistribucion _objD = new catalogoDistribucion();
                int contador = 0;
                for (int i = 1; i < 11; i++)
                {
                    var distribuciones = _objD.obtenerDistribucionXSemestre(i, Convert.ToInt32(HttpContext.Current.Session["CodCarrera"]), _paralelo);
                    foreach (var item in distribuciones)
                    {
                        html.Append("<tr class='odd gradeX'><td>" + (contador += 1) + "</td><td>" + semestre[i - 1] + "</td><td>" + item.Nombre + "</td></tr>");
                    }
                }
                html2.Append("<button type='button' class='btn btn-green' data-toggle='confirmation'>Confirmar!</button>");
                return html.ToString();
            }
            else
            {
                html.Append("<tr><td>Ninguna</td><td>Ninguna</td><td>Se deben de llenar todos los datos</td></tr>");
                html2.Append("");
                return html.ToString();
            }
        }

        [System.Web.Services.WebMethod(true)]
        public static string ingresarAsistenciaCarrera(int _semestre, string _desde, string _hasta, string _observacion)
        {
            try
            {
                string mensaje = comprobarAsistencia(_semestre, _desde, _hasta, _observacion, "");
                if (mensaje == "OK")
                {
                    return "Asistencias ingresadas correctamente.";
                }
                else if (mensaje == "Error")
                {
                    return "Problemas al ingresar las asistencias.";
                }
                else if (mensaje == "Evento")
                {
                    return "Para este dia esta previsto la realizacion de un evento.";
                }
                else
                {
                    return "Ingresar las fechas de manera correcta.";
                }
            }
            catch (Exception)
            {

                return "Ingresar las fechas de manera correcta.";
            }
        }


        #endregion

        #region ingresar asistencia por universidad
        [System.Web.Services.WebMethod(true)]
        public static string AsistenciaUniversidad(string _parametro,string _tipo)
        {
            catalogoCarrera _objCa = new catalogoCarrera();
            Negocio.catalogos.catalogoAsistencia _objAsistencias = new catalogoAsistencia();
            
            //carreras
            //var carreras = _objCa.obtenerTodasCarreras();
            string mensaje = "";
          
                if (_parametro=="SI")
                {
                ///el 14 es por el tipo de asistencia q es "Asistencias feriados"
                mensaje = _objAsistencias.TomarAsistenciasUniversidad(DateTime.Now,14,Convert.ToInt32(_tipo));
                }
                else
                {
                ///el 1 es por el tipo de asistencia q es "Asistencias"
                mensaje = _objAsistencias.TomarAsistenciasUniversidad(DateTime.Now, 1,Convert.ToInt32(_tipo));
                }
            if (mensaje=="OK")
            {
                return "OK";
            }
            else
            {
                return "ERROR";
            }
        }
        //public static string comprobarAsistenciaUniversidad(int _codCarrera, bool feriado)
        //{
        //    //catalogos
        //    catalogoHorario _objH = new catalogoHorario();
        //    catalogoDistribucion _objD = new catalogoDistribucion();
        //    catalogoEstudiante _objE = new catalogoEstudiante();
        //    catalogoCabecera _objC = new catalogoCabecera();
        //    catalogoCalendarioAcademico _objCa = new catalogoCalendarioAcademico();
        //    catalogoCabeceraAsistencia _objCBA = new catalogoCabeceraAsistencia();
        //    catalogoAsistencia _objAsistencias = new catalogoAsistencia();
          
        //    //fechas
        //    DateTime fechActual = DateTime.Now.Date;
        //    if (_codCarrera > 0)
        //    {
        //        try
        //        {
        //            List<distribucion> distribuciones = null;
        //            distribuciones = _objD.obtenerDistribucionXIdCarrera(_codCarrera);
        //            int periodo =  Convert.ToInt32(HttpContext.Current.Session["periodo"]);
        //            foreach (var item in distribuciones)
        //            {
        //                //Horario Actual
        //                var consultaHorario = _objH.obtenerHorarioXidPeriodoANDidDistribucion(periodo, Convert.ToInt32(item.idDistribucion));
        //                var resultFiltroHorario = (from itemHorario in consultaHorario where itemHorario.detalle == fechActual.DayOfWeek.ToString() select itemHorario);
        //                //Fecha Actual
        //                fechActual = DateTime.Now;
        //                //Lista de cabecera
        //                var resultCabecera = _objC.obtenerCabeceraXIdDistribucionANDidPeridoXFechaLimpia(item.idDistribucion, periodo, fechActual);

        //                var listadoEstudiante = _objE.obtenerEstudiante(item.idDistribucion);
        //                //Busqueda de la cabecera guardadas 
        //                bool asistencia = false;
        //                if (resultCabecera.Count == 0)
        //                {
        //                    var resultCalendario = _objCa.obtenerFechadelCalendarioComprobacionAsistencia(periodo, fechActual);
        //                    if (resultCalendario != null)
        //                    {
        //                        asistencia = resultCalendario.asistencia;
        //                    }
        //                    else
        //                    {
        //                        asistencia = true;
        //                    }

        //                    if (resultFiltroHorario.Count() != 0 && asistencia && fechActual.DayOfWeek != DayOfWeek.Saturday && fechActual.DayOfWeek != DayOfWeek.Sunday)
        //                    {
        //                        //Ingreso de las cabeceraAsistencia con los id de los estudiantes

        //                        foreach (var itemFiltroHorario in resultFiltroHorario)
        //                        {
        //                            int idCabecera = _objC.insertarCabecera(new cabecera(0, itemFiltroHorario, fechActual, false, 211049));

        //                            if (idCabecera != 0)
        //                            {
        //                                int contador = 0;

        //                                int nroHoraMateria = new catalogoHorario().obtenerNroHoraHorarioXIDDetalleHorario(itemFiltroHorario.idDetalleHorario);
        //                                foreach (var item2 in listadoEstudiante)
        //                                {
        //                                    int idCabeceraAsistencia = _objCBA.insertarCabecetaAsistencia(new cabeceraAsistencia
        //                                            {
        //                                                idEstudiante = item2.Id_Alumno,
        //                                                idCabecera = idCabecera,
        //                                                idObservacion = 211046
        //                                            });

        //                                    if (idCabeceraAsistencia != 0)
        //                                    {
        //                                        contador = 0;
        //                                        for (int i = 0; i < nroHoraMateria; i++)
        //                                        {
                                                    
        //                                            //para ingresar las asistencias normales
        //                                            if (feriado==false)
        //                                            {
        //                                                if (
        //                                               _objAsistencias.ingresarAsistencia(new asistenciaClase(
        //                                               0,
        //                                               fechActual,
        //                                               1,
        //                                               idCabeceraAsistencia
        //                                               ))
        //                                               )
        //                                                {
        //                                                    contador++;
        //                                                }
        //                                                else
        //                                                {
        //                                                    i--;
        //                                                }
        //                                            }
        //                                            //para ingresar las asistencias cuando son feriado
        //                                            else
        //                                            {
        //                                                if (
        //                                               _objAsistencias.ingresarAsistencia(new asistenciaClase(
        //                                               0,
        //                                               fechActual,
        //                                               14,
        //                                               idCabeceraAsistencia
        //                                               ))
        //                                               )
        //                                                {
        //                                                    contador++;
        //                                                }
        //                                                else
        //                                                {
        //                                                    i--;
        //                                                }

        //                                            }

                                                   
        //                                        }
        //                                    }
        //                                    else
        //                                    {
        //                                        return "Error";
        //                                    }// Comprobacion de cabecera Asistencia

        //                                }//Bucle

        //                            }
        //                            else
        //                            {
        //                                return "Error";
        //                            }//Comprobacion Cabecera 

        //                        }//Bucle Horario 
        //                    }//Cierre el if del dia
        //                }//cierre de la cabecera actual mas de cero
        //            }//end foreach
        //            return "OK";
        //        }
        //        catch (Exception)
        //        {
        //            return "Error";
        //        }

        //    }
        //    else
        //    {
        //        return "Error";
        //    }
        //}
        #endregion
        protected void btnConSemestre_Click(object sender, EventArgs e)
        {

        }

        protected void btnAsiCarrera_Click(object sender, EventArgs e)
        {

        }

        protected void btnConCarrera_Click(object sender, EventArgs e)
        {

        }

        protected void btnAsistenciaUniversidad_Click(object sender, EventArgs e)
        {

        }

    }
}